<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script>
  /*filter*/
  Array.prototype.myFilter = function (fn) {
    // 地址
    let arr = [...this];
    // let arr = Array.prototype.slice(this);
    arr.push(123);
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
      if (fn(arr[i], i)) {
        newArr.push(this[i])
      }
    }
    return newArr
  };
  console.log([1, 2, 3, 4, 5].filter((item, index) => {
    return item % 2 === 0
  }));
  let newArr = [{a: 20}, {a: 22}, {a: 40}, {a: 15}];

  console.log(newArr.myFilter(item => item.a > 20));
  console.log(newArr);
  /*every */
  // every 回调里面每一项返回值都是true 整体的才是true
  // some 其中一项返回true 整体就返回true
  console.log([1, 2, 3, 4].every(item => item > 2));
  Array.prototype.myEvery = function (fn) {
    let arr = [...this];
    // let count = 0;
    // let flag = true;
    for (let i = 0; i < arr.length; i++) {
      // let res = fn&&fn(arr[i], i, arr);
      // if (res) {
      //   count++;
      // }
      if (!fn(arr[i], i, arr)) return false
    }
    return true;
  };

  let array = [1, 2, 3, 4];
  console.log(array.myEvery(item => {
    return item > 1
  }));
  /*find */
  Array.prototype.myFind = function (fn) {
    let arr = this;
    for (let i = 0; i < arr.length; i++) {
      if (fn(arr[i], i, arr)) {
        return arr[i]
      }
    }
  };

  console.log([1, 2, 3].myFind((item) => {
    return item === 3
  }));
  /*findIndex */
  Array.prototype.myfindIndex = function (fn) {
    let arr = [...this];
    for (let i = 0; i < arr.length; i++) {
      if (fn(arr[i])) {
        return i
      }
    }
    return -1;
  };
  console.log([1, 2, 3].myfindIndex((item) => {
    return item === 3;
  }));
  /*flat */
  let arr = [1, 2, 3, [6, 7, 8], 4, 5];
  // console.log(arr.flat(2));
  const myFlat = function (depth = 1) {
    let arr = [...this];
    if (depth === 0) return arr;
    // pre: [] next: 1
    // pre: [1] next : 2
    return arr.reduce((pre, next) => {
      console.log(pre, next);
      if (Array.isArray(next)) {
        // [1,2,3,...]
        return [...pre, ...myFlat.call(next, depth - 1)];
      } else {
        return [...pre, next]; // [1,2,3]
      }
    }, []);
  };
  Array.prototype.myFlat = myFlat;
  console.log(arr.myFlat(Infinity));

  // [1, 2, 3, 4, 5].reduce((pre, next) => {
  //   // 1.  pre: 第一项  next :第二项
  //   // 2.  pre: 回调的返回值 next : 第三项
  //   // 3. reduce 传递了第二个参数
  //   //    回调的第一个参数:reduce第二个参数  pre = 10
  //   //    回调的第二个参数:数组的第一个值
  //   console.log(pre, next);
  //   return next;
  // }, 10);
  //
  // /*reduce */
  // Array.prototype.myReduce = function (fn, init) {
  //   let leng = this.length;// 数组的长度
  //   let pre = init; // reduce的第二个参数
  //   let index = 0; //
  //   if (init === undefined) { // == : null 和 undefined比较的时候 用 == 别的时候 都用全等
  //     pre = this[0];
  //     index = 1
  //   }
  //   for (let i = index; i < leng; i++) {
  //     pre = fn(pre, this[i], i, this)
  //   }
  // };
  //
  // [1, 2, 3, 4, 5, 6].myReduce((pre, next) => {
  //   console.log(pre, next);
  //   return next
  // }, 10);
  //
  //
  // // 第一个参数 : 查找的元素  第二个参数从哪开始
  // console.log([1, 2, 3, 4, 5, 6].includes(4, 3));
  // /*includes*/
  // Array.prototype.myIncludes = function (target, fIndex) {
  //   let arr = [...this];
  //   // let flag = false;
  //   let index = fIndex === 0 || fIndex === undefined ? 0 : fIndex < 0 ? arr.length + fIndex : fIndex;
  //   for (let i = index; i < arr.length; i++) {
  //     if (Object.is(arr[i], target)) {
  //       return true
  //     }
  //   }
  //   return false
  // };
  // console.log([1, 2, 3, 4, 5, NaN, null, undefined].myIncludes(10))
</script>
</body>
</html>
